/**
 * 用户登录状态管理
 * @module Login
 */
import * as base from '@/common/sju.base.js'
import * as nav from '@/common/sju.nav.js'
import { noLogin } from '@/config/config.js'
// 默认配置
import { t } from '@/common/sju.i18n.js'

// 存储键名常量
const STORAGE_KEYS = {
  TOKEN: 'token',
  OPEN_ID: 'openID'
}

/**
 * 检查页面是否需要登录
 * @param {string} url 页面路径
 * @returns {boolean} 是否已登录/无需登录
 */
function checkLogin(url) {
  // 检查是否在免登录白名单
  const needLogin = !noLogin.includes(url)
  
  if (needLogin && !getValue(STORAGE_KEYS.TOKEN)) {
    base.logInfo(t('common.login.need_login', {url}))
    
    // 平台差异处理
    // #ifdef MP-WEIXIN
    weixinLogin()
    // #endif
    
    // #ifdef APP-PLUS || H5
    nav.redirectTo('/intake/login')
    // #endif
    
    return false
  }
  return true
}

/**
 * 微信小程序登录
 * @returns {Promise<void>}
 */
function weixinLogin() {
  return new Promise((resolve, reject) => {
    uni.login({
      provider: 'weixin',
      scopes: 'auth_user',
      success: (loginRes) => {
        request('/api/client/weixinLogin', 'post', { code: loginRes.code }, true)
          .then(res => {
            saveValue(STORAGE_KEYS.OPEN_ID, res.data.openID)
            saveValue(STORAGE_KEYS.TOKEN, res.data.token)
            resolve()
          })
          .catch(reject)
      },
      fail: reject
    })
  })
}

/**
 * 保存数据到本地存储
 * @param {string} key 存储键名
 * @param {*} value 存储值
 */
function saveValue(key, value) {
  try {
    uni.setStorageSync(key, value)
  } catch (e) {
    console.error(t('common.login.storage_fail'), e)
  }
}

/**
 * 从本地存储获取数据
 * @param {string} key 存储键名
 * @returns {*}
 */
function getValue(key) {
  try {
    return uni.getStorageSync(key)
  } catch (e) {
    console.error(t('common.login.read_storage_fail'), e)
    return null
  }
}

/**
 * 清除指定存储项
 * @param {string} key 存储键名
 */
function clearKey(key) {
  try {
    uni.removeStorageSync(key)
  } catch (e) {
    console.error(t('common.login.clear_storage_fail'), e)
  }
}

/**
 * 清除所有本地存储
 */
function clearAll() {
  try {
    uni.clearStorageSync()
  } catch (e) {
    console.error(t('common.login.clear_all_storage_fail'), e)
  }
}

export {
  checkLogin,
  weixinLogin,
  saveValue,
  getValue,
  clearKey,
  clearAll
}
